const util = require('util')
// node 自带的 事件对象
const event = require('events')

/**
 * node 的事件处理是非常的强大的
 *  很多node的核心模块 和第三方模块有关于事件的处理都是基于 这个event 这个事件核心模块实现的
 */

const AudioDevice = {
	play(name) {
		console.log('AudisDevice is playing ', name)
	},
	stop() {
		console.log('AudisDevice is stop play')
	},
}

function MusicPlayer() {
	this.playStatus = false
	event.EventEmitter.call(this)
}

/**
 * util.inherits(A,B)
 *  相当于在A的prototype上添加了 B的一些属性和方法 是基于 Object.create()方法实现的（处理原型）
 *
 * 这个API已经被弃用了 实则是可以使用类 然后写继承方法
 */
util.inherits(MusicPlayer, event.EventEmitter)

let musicPlayer = new MusicPlayer()

/**
 * 因为继承了 event.EventEmitter 这个事件触发类的方法 所以可以实现自定义派发事件
 *
 *  使用 on(事件名，事件回调) 为实例绑定事件
 *
 *  使用 emit(事件名,事件传参) 可以自定义触发事件
 *
 *  还有其他的API 如 ： removeLinstener removeAllListener once(只相应一次) 这些API和浏览器的DOMAPI是非常的相似的
 *
 *  这个事件的用法是非常常见的  原理其实是继承了 node的 event.EventEmitter
 */
musicPlayer.on('play', name => {
	this.playStatus = true
	AudioDevice.play(name)
})

musicPlayer.on('stop', () => {
	this.playStatus = false
	AudioDevice.stop()
})

musicPlayer.emit('play', '如果时光倒流')

setTimeout(() => {
	musicPlayer.emit('stop')
}, 1500)
